package rj

import (
	"fmt"
	"reflect"
	"strconv"
)

type ResponseError struct {
	err interface{}
}

func WrapError(err interface{}) *ResponseError {
	return &ResponseError{err: err}
}

func (r *ResponseError) GetError() error {
	err, ok := r.err.(error)
	if !ok {
		err = fmt.Errorf("%v", r.err)
	}
	return err
}

func (r *ResponseError) MarshalJSON() ([]byte, error) {
	if r.err == nil {
		return nil, nil // []byte(strconv.Quote("")), nil
	}
	// msg := ""
	// if e, ok := r.err.(error); ok {
	// 	msg = e.Error()
	// } else {
	// 	msg = fmt.Sprintf("%v", r.err)
	// }

	val := strconv.Quote(r.GetError().Error())
	return []byte(val), nil
}

// ResponseItem 返回项
type ResponseItem struct {
	Error *ResponseError `json:"error,omitempty"`
	// ErrorMessage string       `json:"-"`               // 设定的错误返回提示
	// ErrorReturn  string       `json:"error,omitempty"` // 要返回的错误信息
	Service  string       `json:"service,omitempty"`
	Data     interface{}  `json:"data,omitempty"`
	DataType reflect.Type `json:"-"`
}

// Response 返回值
type Response map[string]*ResponseItem

// Request 请求对象
type Request struct {
	Service string      `json:"service"`
	Alias   string      `json:"alias"`
	Args    interface{} `json:"args"`
}

// Requests 请求列表
type Requests []*Request
